perm filename CONVX.FAI[IRC,LCS] blob sn#493212 filedate 1980-01-17 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	  THIS CONVERTS PLOTTER FORMAT TO 11/40 DPY FORMAT   AND CLIPS*****
C00014 ENDMK
CāŠ—;
;  THIS CONVERTS PLOTTER FORMAT TO 11/40 DPY FORMAT   AND CLIPS*****
	TITLE CONV 
	INTERNAL GET,NVECT
	EXTERNAL IARRAY,SGZ
	CH3←15	; SGZ=SEGMENT NUM., SGZ+1=SIZE FACTOR (FOR DISPLACEMENT)

N:	0
ZSHIFT:	0
XSHIFT:	0		;THESE FOR VERSATEC ROTATION
WSHIFT:	=178	;PAPER PRINTS "SIDEWAYS".  THIS CENTERS STANDARD STAFF.
YSHIFT:	0    
I:	0
J:	0
K:	0
BOT:	0    	;BOTTOM OF CLIPPED AREA  (200) or (-200)
TOP:	0	;TOP OF CLIPPED AREA (600)
SEGSZ:	=800	;DOES 4 INCH SEGMENT FOR NOW
TOPX:	=600

GET:	OUTSTR[ASCIZ/FILE NAME (DEFAULT=PLT)  /]
	INCHWL 1
	CAIN	1,15		; LOOK FOR CR.
	JRST 	DFAULT
	SETZM DIR		; THE FILE NAME WILL BE HERE.
	SKIPA 2,[POINT 6,DIR]
GOT:	INCHWL	1
	CAIGE	1,60		; CHECKS FOR GOOD CHARS.
	JRST	DONE
	SUBI	1,40
	IDPB	1,2
	JRST	GOT

DFAULT:	MOVE 1,[SIXBIT/PLT/]
	MOVEM 1,DIR
DONE:	INIT CH3,17
	SIXBIT/DSK/
	0
	0
	MOVE 0,[SIXBIT/PLT/]
	MOVEM 0,DIR+1
	SETZM DIR+2
	SETZM DIR+3
	LOOKUP CH3,DIR
	HALT 		;DID NOT FIND FILE
	SETZM DIR+1

;	MOVE 1,SGZ+2	;GET BIG SHIFT (TEMPORARY FEATURE ?)
;	SKIPE 1
;	SOJ 1,
;	IMULI 1,=1700	;SHIFT=(ISHIFT-1)*1700
	
	MOVE SEGSZ
	SKIPN 2,SGZ+2	;IS THERE A SEGMENT SIZE?
	JRST SGX	;NO
	FMPRI 2,(200.0)
	FIX 0,2		;CHANGE INCHES TO STEPS (200/INCH)
SGX:	MOVEM SEGX#
	SKIPE 2,SGZ+1	;GET SIZE FACT.
	FSBRI 2,(1.0)	;YSHIFT=(SZFAC-1)*850+178
	FMPR 2,[850.0]
	FIX 2,2

	SKIPE 1,SGZ	;GET SEGMENT NUMBER  SEG 0 IS SAME AS SEG 1.
	SOJ 1,		;SEG=600-(SEG-1)*800
	IMUL 1,SEGX	;SEGSZ FOR NOW=800
	SUB 1,WSHIFT
	SUB 1,2		;ADD IN FROM ABOVE
	MOVNM 1,YSHIFT

TTOP:	MOVE TOPX
	MOVEM TOP	;TOP=600, BOT=-200 FOR NOW
	SUB SEGX	;SUBTRACT SEGMENT SIZE (4 INCHES FOR NOW)
	MOVEM BOT

	SETZM N		;FOR CLIPPER
	MOVE ZSHIFT
	MOVEM XSHIFT	;FOR RE-STARTS
	SETZ 10,	;FLIP-FLOP FOR CONSECUTIVE INVIS. VECTS.
	SETO 15,	;INITIALIZE XSHIFT (REALLY YSHIFT BECAUSE ROTATED.)
	SETOM PREV	;INITIALIZE FLAG FOR SKIPPING UNNEEDED INVISIBILES.
	SETZM IARRAY	;ZERO 1ST WORD.
	MOVEI 11,1 	;MAIN ARRAY COUNTER(FILL IN 1ST 2 WORDS AT END)
INP:	HRRZI 0,M
	SUBI 0,1
	MOVEM 0,COM
	MOVNI 0,=128
	HRLM 0,COM
	INPUT CH3,COM
	STATZ CH3,740000
	0
	MOVEI 6,1	;COUNTER 
LUP:	MOVEI 5,M
	ADDI  5,(6)
	MOVE 2,(5)	; UNPAC ROUTINE
	LSHC 2,-10	; 14 BITS, 14 BITS, 8 BITS
	ASH 3,-34
	JUMPE 3,NOVEC	;IF(PEN.EQ.0)GO TO NOVEC    START OF 128 WD SEGMENT.
	MOVE 7,3	;MOVEM 3,K 	KEEP IT FOR 11/40 CONVERSION
	LSHC 2,-16
	ASH 3,-26
	MOVEM 3,J 
	LSHC 2,-16
	ASH 3,-26
	MOVEM 3,I

	MOVEI 12,106	;VISIBLE	PACKS IN 11/40 FORMAT
	CAIN 7,2
	JRST VVV
	JUMPG 7,SHIFT	;IS IT -3??
	AOJLE 15,SHFT1	;AOJ 15,		; YES
;;	JUMPLE 15,MORE 	; SKIP FIRST TIME IT HAPPENS
	MOVE J		; GET SHIFT FOR NEXT ORIGINAL INPUT FILE
SHFT2:	ADDM XSHIFT	; UPDATE SHIFT (FIRST TIME IT'S ZERO)
	JRST MORE
SHFT1:	MOVNI =512	;FIRST TIME SUBTRACT 512 FROM SHIFT
	ADD J
	JRST SHFT2
SHIFT:	CAME 7,PREV#	;ARE THERE 2 3'S IN A ROW?
	JRST SHFT3	;NO
	SKIPGE N      	;IF(N.LT.0)SKIP THIS NEXT.  N CAN BE 0,1,-1
	JRST SHFT3
	SKIPN 10	;DID WE DO THIS ALREADY?
	SOJ 11,		;NO, OMIT LAST ONE BY DECREMENTING COUNTER
	SETO 10,	; =-1 SO WE DON'T DO 2 INVIS. IN A ROW
	JRST MORE	;****** SKIP NEXT IF REPEATING ITSELF.
SHFT3:	MOVEI 12,146	;INVISIBLE
	SKIPA
VVV:	SETZ 10,	;RESET FLIP-FLOP
	MOVEM 7,PREV	;SAVE PEN INFO FOR NEXT TIME AROUND
	MOVE 13,J	;JSA 16,PLOT
	ADD 13,XSHIFT  ;***** X AND Y ARE ROTATED -90 DEG. ON VERSATEC!!!
	MOVN 14,I	;JUMP I		PACKS BITS - 11,11,14
	SUB 14,YSHIFT	;NEEDED Y SHIFT FOR PLOT.SAV (VERSATEC CONV. PROG.)
;; ABOVE 2 CAUSE -90 DEG. ROTATION.	MOVE 13,I	;JSA 16,PLOT
;;	MOVE 14,J	;JUMP I		PACKS BITS - 11,11,14
	MOVEI 16,CLPX	;LOC. OF ARGS. FOR CLIPPER
	PUSHJ 17,CLIP
	SKIPGE N      	;IF(N.LT.0)WAIT TIL NEXT VECTOR FOR CLIPPED POS.
	JRST MORE
VEC1:	DPB 13,[POINT 11,12,10]	;JUMP J
	DPB 14,[POINT 11,12,21]	;JUMP K
	AOJ 11,
	MOVEM 12,IARRAY(11)	;CAMGE 6,M
;XXX NOT NEEDED IF NOVEC TRAP IS OK.	CAMG 6,M
MORE:	AOJA 6,LUP

NOVEC:	MOVE 2,M
	CAIN 2,=127
	JRST INP
;;	CAIE 7,2	;WAS LAST VECTOR VISIBLE OR NOT?
;;	SOJ 11,		;NO, SO DELETE IT.  (BACKUP ONE WORD.)
;;	SOJ 11,			;PUT A 0 WORD, THEN TOTAL WORD-COUNT LESS 2
	MOVEM 11,IARRAY+1	;INTO 2ND WORD. THEN EXIT
	OUTSTR[ASCIZ/WRITING P.PLT
  /]
	POPJ 17,

CLPX:	JUMP 13
	JUMP 14
	JUMP 7

NVECT:	MOVEI 4,146	; NEW VECTOR POINT - FROM CLIP ROUTINE
;;	MOVE 1,@2(16)	;VIS. OR INVIS.?
;;	CAIE 1,2	
;;	MOVEI 4,106	;VIS.
	MOVE 1,@(16)	;GET NEW J
	MOVE 2,@1(16)	;GET NEW K
VEC2:	DPB  1,[POINT 11,4,10]	;JUMP J
	DPB  2,[POINT 11,4,21]	;JUMP K
	AOJ 11,
	MOVEM 4,IARRAY(11)
	POPJ 17,   

COM:	OCT 0,0
BLKNUM:	0

M:	BLOCK =128

DIR:	BLOCK 4


;MC:	=200	;	SUBROUTINE CLIP(J,K,L)
;NC:	=600	;C		   (AC13,AC14,AC7)
CLIP:	MOVE @(16)	;COMMON /JCLIP/MC,NC,N
	MOVEM J#	;C ASSUMES N IS INITIALIZED =0
	MOVE 5,@1(16)	; K	IF(L.NE.3)GO TO 1
	MOVE 3,KK
	MOVE @2(16)	;DATA MC/-824/,NC/-424/
	CAIE 3		;IF(K.LT.MC.OR.K.GE.NC)GO TO 40
	JRST CL1	;C NOW INBOUNDS
	SETZM N
	CAML 5,BOT	;	N=0
	CAML 5,TOP	;	GO TO 4
	SETOM N  	;1	IF(N.EQ.0)GO TO 11
                     	;C JUMP IF LAST POINT WAS IN BOUNDS
	JRST CL4	;C NOW JJ IS OUT OF BOUNDS, CLIP IT
CL1:	MOVEM 16,AC16#
	SKIPN N		;5	IF(K.LT.MC.AND.KK.LT.MC)GO TO 9
	JRST CL11	;	IF(K.GE.NC.AND.KK.GE.NC)GO TO 9
	CAMGE 5,BOT	;C GO BACK IF ENTIRE SEGMENT IS OUT OF BOUNDS
	CAML 3,BOT	;6	CALL CL(JJ,KK,J,K,JJ,KK)
	SKIPA
	JRST CL9	;C CLIP FROM INVIS VECT WHICH IS OUT OF BOUNDS OR V-V
	CAML 5,TOP	;	CALL NVECT(JJ,KK)
	CAMGE 3,TOP	;C GO PUT AWAY CLIPPED VECTOR POINT, THEN NEW POINT
	SKIPA		;C CLIP MORE IF OTHER POINT IS ALSO OUT.
	JRST CL9	;	IF(K.LT.MC.OR.K.GE.NC)GO TO 7
	MOVEI 16,CX6	;
	PUSHJ 17,CL
	PUSHJ 17,NVECT	
;;	CAML 5,MC	;11	IF(K.LT.MC.OR.K.GE.NC)GO TO 7
;;	CAML 5,NC	;	N=0
;;	JRST CL7	;	GO TO 4
;;	JRST CL4	;9	N=-1
CL11:	CAML 5,BOT	;4	JJ=J
	CAML 5,TOP	;	KK=K
	JRST CL7	;C REMEMBER THE COORDS.
	SETZM N        	;	RETURN
	SKIPA          	;7 	CALL CL(J,K,JJ,KK,J,K)
CL9:	SETOM N		;  AFTER 7 CHANGED!
CL4:	MOVE 4,J		;
CX4:	MOVEM 4,JJ#	;	GO TO 4
	MOVEM 5,KK#	;40	N=-1
	POPJ 17,	;	GO TO 4
CL7:	MOVEI 16,CX7	;	END
	PUSHJ 17,CL
	MOVE 16,AC16
	MOVE @(16)	;JJ=J
	MOVEM JJ
	MOVE @1(16)	;KK=K
	MOVEM KK
	MOVEM 4,@(16)
	MOVEM 5,@1(16)
	MOVEI 1
	MOVEM N		;N=1
	POPJ 17,	;JRST CX4

CX6:	JUMP JX#
	JUMP KX#
CX7:	JUMP J
	JUMP 5
	JUMP JJ
	JUMP KK
	JUMP J
	JUMP 5

CL:	MOVE TOP		;	SUBROUTINE CL(JX,KX,J,K,JJ,KK)
	SOS		;C                 RETURN -- IN -- OUT
	MOVE 1,@5(16)	;	COMMON /JCLIP/MC,NC
	CAMGE 1,TOP	;C JJ,KK=OLD POINT    J,K=NEW POINT  JX,KX=CLIPPED
	MOVE BOT		;	KX=NC-1
	MOVEM @1(16)	;	IF(KK.LT.NC)KX=MC  
	SUB 1,@3(16)	;C JUMP IF OFF TOP OF AREA
	FLTR 1,1	
	MOVE 4,@4(16)	;C NOW IT'S OFF BOTTOM OF AREA
	SUB 4,@2(16)	;1	A=KK-K
	SUB @3(16)	;	B=(JJ-J)*(KX-K)
	IMUL 4,0	;	C=B/A
	FLTR 4,4
	FDVR 4,1	;	JX=J+C
	FIX 4,4		;C NOW THE VECT. IS FROM KX,JX TO J,K -- ALL INBOUNDS.
	ADD 4,@2(16)	;	END       
	MOVEM 4,@(16)	;AC4 HAS JX, AC0 HAS KX
	POPJ 17,
	END